/*
    开始时间：2024/3/6
    内容：进程信号的学习--》信号捕捉的测试
    作者：剑痴
    结束时间：2024/3/6
*/

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <string.h>
using namespace std;
void printBlock(sigset_t *p)
{
    cout << getpid() << "->当前进程的信号集：";
    for (int i = 1; i <= 31; i++)
    {
        if (sigismember(p, i))
            cout << 1;
        else
            cout << 0;
    }
    cout << endl;
}
void handler(int sigo)
{
    cout<<getpid();
    cout << ":捕捉到信号:" << sigo << endl;
    sigset_t pending;
    int cnt = 30;
    while(cnt--)
    {
        sigemptyset(&pending); // 非必须操作
        sigpending(&pending);
        printBlock(&pending);
        sleep(1);
    }
  
}

int main()
{
    struct sigaction act, oact;
    memset(&act, 0, sizeof(act));
    memset(&oact, 0, sizeof(oact));
    act.sa_handler = handler;  //捕捉2号信号，执行用户自定义操作
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask); //sa_mask是信号集
    sigaddset(&act.sa_mask,3); //添加阻塞的信号
    sigaddset(&act.sa_mask,4); //添加阻塞的信号
    sigaddset(&act.sa_mask,5); //添加阻塞的信号

    // #define SA_NOCLDSTOP 1 /* Don't send SIGCHLD when children stop.  */
    // #define SA_NOCLDWAIT 2 /* Don't create zombie on child death.  */
    // #define SA_SIGINFO 4		 /* Invoke signal-catching function with
    sigaction(2, &act, nullptr); //对那个信号进行捕捉，指定莫格信号
    while (true)
    {
        sleep(1);
    }
    return 0;
}